package com.lyf.alg.practice.newcoder.top101.link;

/**
 * 链表类题目
 * 1.回忆
 * （1）链表的基础操作- - 查询、删除、添加、修改、合并
 * （2）环的判断，
 *
 * 2.牛客网
 * (1)链表反转及K区间的反转 -- 递归与迭代
 * (2)环 及 倒数n 的节点问题 -- 双指针的应用、递归的使用
 *  →  熟悉 迭代遍历、 理解递归回退（结合公共变量使用）、  拓展双指针的思维应用
 *
 *
 * @author LYF
 * @date 2022/6/24
 */
//class ListNode{
//    int val;
//    ListNode next = null;
//
//    ListNode(int val) {
//        this.val = val;
//    }
//}
public class LinkTests {
    private static class LinkNode<T>{
            T item;
            LinkNode<T> next;

        public LinkNode(T item, LinkNode<T> next) {
            this.item = item;
            this.next = next;
        }

        public T getItem() {
            return item;
        }

        public void setItem(T item) {
            this.item = item;
        }

        public LinkNode<T> getNext() {
            return next;
        }

        public void setNext(LinkNode<T> next) {
            this.next = next;
        }
    }
    void createLinkList(LinkNode[]linkNodes){
    }
    static ListNode reserve(ListNode head){
        if(head==null||head.next==null)
            return head;

        ListNode p = head;
        ListNode q = head.next;

        while(q!=null){
            ListNode tmp = q.next;// q 需要迭代的位置
            q.next = p;
            p = q;
            q = tmp;
        }
        return p;
    }

    // 递归回退
    static ListNode recursion(ListNode head,int k){
           if(head!=null&&head.next!=null){
               recursion(head.next,k);
           }
           System.out.println(head);// 回退打印
           return head;
    }


    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        node2.next=node3;
        head.next=node2;
//        ListNode tmp = reserve(head);
//        System.out.println(tmp);

        ListNode tmp = recursion(head,1);
    }

}
